# 导入os模块
import os


# 调用函数，定义一个函数
def main02():
    while True:
        menu1()  # 调用菜单menu1()这一函数
        try:  #异常处理，如果没有异常就执行try语句中的内容，如果存在异常就会进入except语句中
            option = int(input("请输入:"))
        except:
            print('输入错误')
            continue  #结束当前循环
        if is_login:  #判断是否登录上，如果登录上则会进入if语句中，否则会进入下面else语句中运行
            if option in [0, 1, 2, 3]:  #选择你想要执行的功能
                if option == 0:
                    answer = input("您确定退出系统吗?如果输入y或Y即退出，否则继续:")
                    if answer == 'y' or answer == 'Y':
                        print("感谢您的访问!")
                        break  #结束整个循环
                elif option == 1:
                    modify2()  #调用修改个人信息这一方法
                elif option == 2:
                    search1()  #调用查找部门信息这一方法
                elif option == 3:
                    display()  #调用展示部门信息这一方法
            else:  #如果输入的不是0，1，2，3则会提示输入错误
                print("输入错误，请重新输入!")
        else:  #进行没有登录上的操作
            if option in [0, 1, 2]:
                if option == 0:
                    answer = input("您确定退出系统吗?如果输入y或Y即退出，否则继续:")
                    if answer == 'y' or answer == 'Y':
                        print("感谢您的访问!")
                        break  #结束整个循环
                elif option == 1:
                    register()  #调用register()这一函数
                elif option == 2:
                    login()  #调用login()这一函数
            else:  #如果输入的不是0，1，2会提示你重新输入
                print("输入错误，请重新输入！")


def menu1():  #员工系统的菜单
    if is_login:  #如果登录成功，则会进入此菜单
        print("-" * 20, "欢迎您进入员工系统", "-" * 20)
        print("-" * 21, "功能选择", "-" * 22)
        print("\t" * 5, "1.修改个人信息")
        print("\t" * 5, "2.查找部门信息")
        print("\t" * 5, "3.展示所有部门信息")
        print("\t" * 5, "0.退出系统")
    else:  #如果没有登录成功将进入下面这个菜单
        print("-" * 20, "欢迎您进入公司系统", "-" * 20)
        print("-" * 21, "功能选择", "-" * 22)
        print("\t" * 5, "1.注册")
        print("\t" * 5, "2.登录")
        print("\t" * 5, "0.退出系统")


# 员工注册系统
def register():
    user_list = []  #声明两个空列表
    old_user = []
    while True:  #录入员工信息
        name = input("请输入用户名:")
        password = input("请输入你的密码:")
        sex =input("请输入你的性别:")
        age = int(input("请输入你的年龄:"))
        ability = input("请输入你的能力:")
        telephone = int(input("请输入你的电话号码:"))
        with open(filename1, 'r', encoding='utf-8') as fp:  # 打开employee.txt文件，并读取文件内容
            data = fp.readlines()  # 读取文件中的每一行，保存在一个列表变量中，每一行作为一个元素
            for i in data:  # for循环语句
                old_user.append(dict(eval(i)))  # 在old_user列表中增加所读取的内容，并以字典的形式写入
        u = True  #声明一个u=True
        for user in old_user:
            if user['name'] == name:
                u = False  #如果输入的名字和文件中存在的一样，u=False
                break  # 用于结束整个循环
                # continue 用于结束当前循环
        if u:  #如果u=True
            print("注册成功!!")
            user = {"name": name, "password": password, "sex":sex, "age": age, "ability": ability, "telephone":telephone}  # 将字典拼接在一起
            user_list.append(user) #在空列表中加入user中的内容
            save(user_list)  # 保存信息
            return  # 终止函数
        else:  #如果u=False
            print('该用户已注册，请重新选择你要进行的操作')
            break #结束整个循环


filename1 = 'employee.txt'

import time
#导入time模板


# 员工登录系统
is_login = False
def login():  #登录函数
    users_data = []  #声明一个空列表
    while True:
        with open(filename1, 'r', encoding='utf-8') as fp:  #打开文件并读取文件内容
            b = fp.readlines()  #读取文件每行的内容
            for i in b: #for
                users_data.append(dict(eval(i)))
        for h in range(3):  # 只有三次登录机会
            name = input("请输入用户名:")
            password = input("请输入密码:")
            for user in users_data:
                if user['name'] == name and user['password'] == password:
                    print("登录成功!!")
                    global is_login  # global为全局变量
                    is_login = True
                    return

            print("用户名或密码错误,登陆失败")
            print("您还剩%d次登录的机会" % (2 - h))
        else:
            print("登录失败，已超过3次，请稍后在试！")
            time.sleep(3)  # 停止三秒后可重新登录
            break



# 定义一个main()函数
def main():
    while True:
        menu()  #调用菜单
        try:   #异常处理，如果没有错误就执行try语句，否则执行except语句
            choice = int(input("请输入:"))
        except:
            print("输入错误")
            continue
        if is_dl:  #如果管理员登录成功就进入以下操作
            if choice in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11]:
                if choice == 0:
                    answer = input("您确定退出系统吗?如果输入y或Y即退出，否则继续:")
                    if answer == 'y' or answer == 'Y':
                        print("感谢您的使用!")
                        break
                elif choice == 1:
                    insert()  #调用录入(增加)员工信息的函数
                elif choice == 2:
                    search()  #调用查找员工信息的函数
                elif choice == 3:
                    delete()  #调用删除员工信息的函数
                elif choice == 4:
                    modify()  #调用管理员修改员工信息的函数
                elif choice == 5:
                    total()   #调用统计员工总数的函数
                elif choice == 6:
                    show()    #调用展示所有员工信息的函数
                elif choice == 7:
                    add1()   #调用录入(增加)部门信息的函数
                elif choice == 8:
                    search1()  #调用查找部门信息的函数
                elif choice == 9:
                    delete1()  #调用删除部门信息的函数
                elif choice == 10:
                    modify1()  #调用修改部门信息的函数
                elif choice == 11:
                    display()  #调用展示所有部门信息的函数
            else:
                print("输入有误，请重新输入!")
        else:  #如果没有登录成功，则执行以下操作
            if choice in [0, 1]:
                if choice == 0:
                    answer = input("您确定退出系统吗？如果输入y或Y即退出，否则继续:")
                    if answer == 'y' or answer == 'Y':
                        print("感谢您的使用!")
                        break
                elif choice == 1:
                    denglu()
            else:
                print("输入错误")


# 管理员登录系统
is_dl = False
def denglu():
    for i in range(3):  # 只有三次登录机会
        name = input("请输入用户名:")
        password = input("请输入密码:")
        if name=='huangying' and password=='huangying':
            print("登录成功!")
            global is_dl  # 全局变量
            is_dl = True
            return
        else:
            print("用户名或密码错误,登录失败")
            print("您还剩%d次机会" % (2 - i))
    else:
        print("登录失败，已超过3次，请稍后在试！")
        time.sleep(3) #三秒后才能再次进行登录



#管理员系统的菜单
def menu():
    if is_dl: #如果管理员已登录则可进行下面功能
        print("=" * 20, "企业管理系统", "=" * 20)
        print("-" * 21, "功能选择", "-" * 22)
        print("\t" * 5, "1.录入(增加)员工信息")
        print("\t" * 5, "2.查找员工信息")
        print("\t" * 5, "3.删除员工信息")
        print("\t" * 5, "4.修改员工信息")
        print("\t" * 5, "5.统计员员工信息")
        print("\t" * 5, "6.显示所有员工信息")
        print("\t" * 5, "7.录入(增加)部门信息")
        print("\t" * 5, "8.查找部门信息")
        print("\t" * 5, "9.删除部门信息")
        print("\t" * 5, "10.修改部门信息")
        print("\t" * 5, "11.显示所有部门信息")
        print("\t" * 5, "0.退出系统")
    else:  #如果没有登录成功则进行下面操作
        print("=" * 20, "管理员登录系统", "-" * 20)
        print("-" * 21, "功能选择", "-" * 22)
        print("\t" * 5, "1.登录")
        print("\t" * 5, "0.退出系统")
# \t 代表空格


# 管理员录入(增加)员工信息
def insert():
    while True:
        employee_name = input("请输入想要添加员工的name:")
        employee_password = input("请输入需要添加的员工的密码:")
        employee_sex =input("请输入你的性别:")
        employee_age = int(input(("请输入需要添加员工的年龄：")))
        employee_ability = input("请输入需要添加员工的技能：")
        employee_telephone = int(input("请输入你的手机号码:"))
        if employee_name != '' and employee_password != '' and employee_sex !='' and employee_age != '' and employee_ability != '' and employee_telephone !='':
            if os.path.exists(filename1):  # 如果这个文件存在
                with open(filename1, 'r', encoding='utf-8') as file:  # 打开文件并读取文件
                    employee_a = file.readlines()  #读取文件每行的内容
            else:
                employee_a = []  #如果文件不存在，则会声明一个空列表
            with open(filename1, 'a', encoding='utf-8') as wfile:  # a代表追加内容
                a = 0  # 没有一样的内容
                for item in employee_a:
                    d = dict(eval(item))
                    if d['name'] == employee_name:
                        a += 1
                        print("已存在此员工")
                if a == 0:
                    person = {'name': employee_name, 'password': employee_password, 'sex':employee_sex,'age': employee_age,
                              'ability': employee_ability,'telephone':employee_telephone}
                    wfile.write(str(person) + '\n')  # 换行 并把此内容写到文件里
                    print(f"name为{employee_name}的员工信息已经添加！")
                else:
                    print("没有添加成功")
        else:
            print('输入错误')
        answer = input("是否继续输入员工信息？如果输入y或Y即继续，否则退出:")
        if answer == 'y' or answer == 'Y':
            continue
        else:
            break

#将员工信息保存到'employee.txt'文件中
filename1 = 'employee.txt'


# 保存到文件(保存员工信息)
def save(lst):
    try:  # try,except语句异常处理，当try语句中无异常发生将不会执行except中的内容
        emp_txt = open(filename1, 'a', encoding='utf-8')
    except:  # 只有在产生异常的情况下才会被执行
        emp_txt = open(filename1, 'w', encoding='utf-8') #打开文件，将文件内容清空
    for item in lst:
        emp_txt.write(str(item) + '\n')  #写入文件中
    emp_txt.close()  # 关闭文件



# 搜索员工信息并显示
def search():
    employee_query = []  #声明一个空列表
    while True:
        if os.path.exists(filename1):  #如果该文件存在
            mode = input('按name查找请输入1:')
            if mode == '1':
                name = input('请输入员工姓名:')
            else:
                print("输入信息有误")
                search()  #调用search()函数
            with open(filename1, 'r', encoding='utf-8') as rfile:
                employee = rfile.readlines()
                for item in employee:
                    d = dict(eval(item.strip()))  # strip()默认删除字符串头和尾的空白字符
                    if name != '':
                        if d['name'] == name:
                            employee_query.append(d)
            show_employee(employee_query)  #调用show_employee()函数
            employee_query.clear()  # 将列表清空，以便再次输入查询其他信息
            answer = input('是否继续查询员工信息？如果输入y或Y即继续，否则退出:')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break
        else:
            print('尚未保存员工信息')




# 管理员搜索员工信息
def show_employee(lst):
    if len(lst) == 0:
        print('没有查询到该员工信息，无数据显示')
        return
    else:
        print('name\t' + 'sex\t\t' + 'age\t\t' + 'ability\t\t' +'telephone')
    for item in lst:
        print(item.get('name') + ' ' * (8 - len(item.get('name'))) + item.get('sex')+' '*(7-len(item.get('sex'))) +  str(item.get('age')) + ' ' * (
                          9 - len(str(item.get('age')))) + item.get('ability')+' '*(8-len(item.get('ability')))+str(item.get('telephone')))


# 员工搜索自己的信息
def show_employee1(lst):
    if len(lst) == 0:
        print('没有查询到该员工信息，无数据显示')
        return
    else:
        print('name\t\t'+'password\t\t' + 'sex\t\t\t' + 'age\t\t\t' + 'ability\t\t' +'telephone')
    for item in lst:

        print(item.get('name') + ' ' * (12 - len(item.get('name'))),end='')
        print(item.get('password')+' '*(17-len(item.get('password'))),end='')
        print(item.get('sex')+' '*(13-len(item.get('sex'))),end='')
        print(str(item.get('age')) + ' ' * (12 - len(str(item.get('age')))),end='')
        print(item.get('ability')+' '*(15-len(item.get('ability'))),end='')
        print(str(item.get('telephone')))



#  员工修改信息
def modify2():
    employee_l=[]
    while True:
        if os.path.exists(filename1):
            name=input("请输入你的用户名:")
            with open(filename1, 'r', encoding='utf-8') as rfile:
                employee = rfile.readlines()
            for item in employee:
                d = dict(eval(item.strip()))
                if name != '':
                    if d['name'] == name:
                        employee_l.append(d)
                        show_employee1(employee_l)
                        employee_l.clear()  #清空列表
                        print("找到{name}的信息，可以修改")
                        break
            else:
                print(f'没有找到{name}的信息，请重新尝试')
                answer = input('是否继续修改员工信息？如果输入y或Y即继续，否则退出:')
                if answer == 'y' or answer == 'Y':
                    continue
                else:
                    break

            with open(filename1, 'w', encoding='utf-8') as wfile: #打开文件并清空
                for item in employee:
                    d = dict(eval(item))
                    if d['name'] == name:
                        while True:
                            try:
                                d['sex'] = input('请输入你的性别:')
                                d['age'] = int(input('请输入修改后的年龄：'))
                                d['ability'] = input('请输入修改后的技能：')
                                d['telephone'] = int(input('请输入你的电话号码:'))
                            except:
                                print('输入有误，请重新输入')
                                continue
                            else:
                                break
                        wfile.write(str(d) + '\n')
                    else:
                        wfile.write(str(d) + '\n')
                print("信息修改成功!!")
            answer = input('是否继续修改员工信息？如果输入y或Y即继续，否则退出:')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break

# 删除员工信息
def delete():
    while True:
        employee_name = input('请输入想要删除的name：')
        if employee_name != '':
            if os.path.exists(filename1):
                with open(filename1, 'r', encoding='utf-8') as file:  #encoding='utf-8'是默认编码格式
                    employee_old = file.readlines()
            else:
                employee_old = []
            flag = False
            if employee_old:
                with open(filename1, 'w', encoding='utf-8') as wfile:  # w可以将内容写入文件中，如果文件中有内容将其清空
                    for item in employee_old:  # w操作时写的文件不存在不会报错，会创建新的文件并写入
                        d = dict(eval(item))
                        if d['name'] != employee_name:
                            wfile.write(str(d) + '\n')  # 还将以前的内容写入
                        else:
                            flag = True
                    if flag:
                        print(f"name为{employee_name}的员工信息已经删除！")

                    else:
                        print(f'没有找到name为{employee_name}的员工信息')
        else:
            print('无此员工信息')

        show()  # 调用函数
        answer = input('请选择是否继续删除员工信息？如果输入y或Y即继续，否则退出:')
        if answer == 'y' or answer == 'Y':
            continue
        else:
            return

# 管理员修改信息
def modify():
    show()
    if os.path.exists(filename1):
        with open(filename1, 'r', encoding='utf-8') as rfile:
            employee_old = rfile.readlines()
    else:
        print()
        return
    while True:
        employee_name = input('请输入你想要修改的员工的名字：')
        for item in employee_old:
            d = dict(eval(item))
            if d['name'] == employee_name:
                print(f'找到{employee_name}的信息，可以修改')
                break

        else:

            print(f'没有找到{employee_name}的信息，请重新尝试')
            answer = input('是否继续修改员工信息？如果输入y或Y即继续，否则退出:')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break

        with open(filename1, 'w', encoding='utf-8') as wfile:
            for item in employee_old:
                d = dict(eval(item))
                if d['name'] == employee_name:
                    while True:
                        try:
                            d['password'] = input('请输入修改后的密码:')
                            d['age'] = int(input('请输入修改后的年龄：'))
                            d['ability'] = input('请输入修改后的技能：')
                            d['telephone'] = int(input('请输入修改后的电话号码:'))
                        except:
                            print('输入有误，请重新输入')
                            continue
                        else:
                            break
                    wfile.write(str(d) + '\n')
                else:
                    wfile.write(str(d) + '\n')
            print("信息修改成功!!")
        answer = input('是否继续修改员工信息？如果输入y或Y即继续，否则退出:')
        if answer == 'y' or answer == 'Y':
            continue
        else:
            break





# 录入总人数
def total():
    if os.path.exists(filename1):
        with open(filename1, 'r', encoding='utf-8') as rfile:
            employee = rfile.readlines()
            if employee:
                print(f'一共有{len(employee)}名员工')  # 求所录员工的总人数
            else:
                print('还未录入员工信息')
    else:
        print('还未保存员工信息')


# 展示信息
def show():
    employee_list = []
    if os.path.exists(filename1):
        with open(filename1, 'r', encoding='utf-8') as rfile:
            employee = rfile.readlines()
        for item in employee:
            employee_list.append(eval(item))
        if employee_list:
            show_employee(employee_list)  # 调用show_employee()函数


# 打开一个新的文件,保存信息
def save1(lst):
    try:
        dep_txt = open(filename, 'a', encoding='utf-8')
    except:
        dep_txt = open(filename, 'w', encoding='utf-8')
    for item in lst:
        dep_txt.write(str(item) + '\n')
    dep_txt.close()


# 录入(增加)部门信息
def add1():
    while True:
        depart = input("请输入想要添加的部门的名称:")
        numbers = input("请输入想要添加的部门所需人员数目:")
        introduce = input("请输入想要添加的部门的简介:")
        slogan = input("请输入想要添加的部门的口号:")
        if depart != '' and numbers != '' and introduce != '' and slogan != '':
            if os.path.exists(filename):
                with open(filename, 'r', encoding='utf-8') as file:
                    depart_add1 = file.readlines()
            else:
                depart_add1 = []
            with open(filename, 'a', encoding='utf-8') as wfile:
                a = 0
                for item in depart_add1:
                    d = dict(eval(item))
                    if d['depart'] == depart:
                        a += 1
                        print("已存在此部门")

                if a == 0:
                    dep = {"depart": depart, "numbers": numbers, "introduce": introduce, "slogan": slogan}
                    wfile.write(str(dep) + '\n')
                    print(f"名字为为{depart}的部门信息已经添加！")

                else:
                    print("该部门没有添加成功")

        else:
            print('输入错误')
        answer = input("是否继续输入部门信息？如果输入y或Y即继续，否则退出:")
        if answer == 'y' or answer == 'Y':
            continue
        else:
            break

#将部门信息保存到'depart.txt'文件中
filename = 'depart.txt'


# 查询部门信息
def search1():
    depart_query = []
    while True:
        if os.path.exists(filename):
            n = input('请输入1按部门名称查询:')
            if n == '1':
                depart = input("请输入部门的名称:")
            else:
                print("输入信息有误")
                search1()
            with open(filename, 'r', encoding='utf-8') as rfile:
                depart1 = rfile.readlines()
                for item in depart1:
                    d = dict(eval(item))
                    if depart != '':
                        if d['depart'] == depart:
                            depart_query.append(d)
                            # 显示查询结果
            search_depart(depart_query)
            depart_query.clear()
            answer = input('是否继续查询部门信息？如果输入y或Y即继续，否则退出:: ')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                return
        else:
            print('尚未保存部门信息：')


def search_depart(lst):
    if len(lst) == 0:
        print('没有查询到该部门信息，无数据显示')
        return
    else:
        print('depart\t\t', 'numbers\t\t', 'introduce\t\t\t', 'slogan')
    for item in lst:
        print(item.get('depart') + " " * (12 - len(item.get('depart'))),
              item.get('numbers') + " " * (12 - len(item.get('numbers'))),
              item.get('introduce') + " " * (13 - len(item.get('introduce'))),
              item.get('slogan') + " " * (len(item.get('slogan'))))


# 删除部门信息
def delete1():
    while True:
        depart = input('请输入想要删除的部门：')
        if depart != '':
            if os.path.exists(filename):
                with open(filename, 'r', encoding='utf-8') as file:
                    depart_old = file.readlines()
            else:
                depart_old = []
            flag = False
            if depart_old:
                with open(filename, 'w', encoding='utf-8') as wfile:
                    for item in depart_old:
                        d = dict(eval(item))
                        # print(d)
                        if d['depart'] != depart:
                            print(str(d))
                            wfile.write(str(d) + '\n')
                        else:
                            flag = True
                    if flag:
                        print(f"{depart}已经删除！")
                    else:
                        print(f'没有找到name为{depart}的部门信息')
            else:
                print('无此部门信息')
                break
            answer = input('请选择是否继续删除部门信息？如果输入y或Y即继续，否则退出:')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                return


#修改部门信息
def modify1():
    display()
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as rfile:
            depart_old = rfile.readlines()
    else:
        print()
        return
    while True:
        depart_name = input('请输入你想要修改的部门的名称：')
        for item in depart_old:
            d = dict(eval(item))
            if d['depart'] == depart_name:
                print(f'找到{depart_name}部门的信息，可以修改')
                break

        else:

            print(f'没有找到{depart_name}部门的信息，请重新尝试')
            answer = input('是否继续修改部门信息？如果输入y或Y即继续，否则退出:')
            if answer == 'y' or answer == 'Y':
                continue
            else:
                break

        with open(filename, 'w', encoding='utf-8') as wfile:
            for item in depart_old:
                d = dict(eval(item))
                if d['depart'] == depart_name:
                    while True:
                        try:
                            d['depart'] = input('请输入修改后的部门的名称:')
                            d['numbers'] = input('请输入修改后的部门所需人员数量:')
                            d['introduce'] = input('请输入修改后的部门的简介：')
                            d['slogan'] = input('请输入修改后的部门的口号：')
                        except:
                            print('输入有误，请重新输入')
                            continue
                        else:
                            break
                    wfile.write(str(d) + '\n')
                else:
                    wfile.write(str(d) + '\n')
            print("信息修改成功!!")
        answer = input('是否继续修改部门信息？如果输入y或Y即继续，否则退出:')
        if answer == 'y' or answer == 'Y':
            continue
        else:
            break

# 显示部门信息
def display():
    depart_lst = []
    if os.path.exists(filename):
        with open(filename, 'r', encoding='utf-8') as rfile:
            a = rfile.readlines()
        for item in a:
            depart_lst.append(eval(item))
        if depart_lst:
            search_depart(depart_lst)


if __name__ == '__main__':  # 主方法，程序开始
    c = int(input("你是管理员还是员工?如果是员工去输入1，如果是管理员请输入2:"))
    if c == 1:
        main02()  # 调用函数
    elif c == 2:
        main()
